home *** CD-ROM | disk | FTP | other *** search
- ;
-
- ; grafix --- cgagrafa.asm
-
- ;
-
- ; stuff to plot points fast in 8086 assembler (BLEECH!!!)
-
- ;
-
- ; Written 4/87 by Scott Snyder (ssnyder@romeo.caltech.edu or @citromeo.bitnet)
-
- ;
-
- ; Modified 5/29/87 by sss to allow for different memory models
-
- ;
-
-
-
- title cgagrafa
-
-
-
- include macros.ah
-
-
-
- sseg
-
- endss
-
-
-
- g_oddoff equ 02000h
-
- g_linsiz equ 80
-
-
-
- dseg
-
-
-
- ex g_drawbuf, dword
-
- ex g_pixbyte, word
-
- ex g_bitpix, word
-
- ex g_colormask, byte
-
- ex g_cmask_tbl, byte
-
- ex g_hicolormask, byte
-
- ex g_xor, word
-
- ex g_xcliplo, word
-
- ex g_xcliphi, word
-
- ex g_ycliplo, word
-
- ex g_ycliphi, word
-
-
-
- endds
-
-
-
- cseg _cgagrafa
-
-
-
- ; plot a point. ax = y; bl = c; cx = x;
-
-
-
- pBegin plot
-
-
-
- les si, g_drawbuf ; get address of buffer
-
- sar ax, 1 ; y /= 2
-
- jnc p1 ; add in offset if it was odd
-
- add si, g_oddoff
-
- p1: mov dx, g_linsiz ; y * g_linsiz
-
- mul dx
-
- add si, ax ; add to offset
-
- mov ax, cx ; x to AC (ohhh... what symmetry!)
-
- mov dx, 0
-
- div g_pixbyte
-
- add si, ax ; add quotient to offset (now complete)
-
- and bl, g_colormask ; get cmask
-
- mov bl, g_cmask_tbl[bx]
-
- mov cx, g_bitpix ; only works for bitpix = 0 or 1!
-
- dec cx
-
- shl dx, cl ; dx = mask shift count
-
- mov cx, dx
-
- mov dl, g_hicolormask ; get mask
-
- shr dl, cl ; shift it
-
- and bx, dx ; bx = cmask & mask
-
- mov al, es:[si] ; get image byte
-
- cmp g_xor, 0 ; xor mode?
-
- jne p2
-
- not dl ; no - (*ptr & ~mask) | (cmask & mask)
-
- and al, dl
-
- or al, bl
-
- jmp p3
-
- p2: xor al, bl ; yes - *ptr ^ (cmask & mask)
-
- p3: mov es:[si], al ; done!
-
- ret
-
-
-
- pEnd plot
-
-
-
- ;
-
- ; C interface for point plotter
-
- ;
-
- ; CGA_point(x, y, c)
-
- ;
-
-
-
- pBegin CGA_point
-
- push bp
-
- mov bp, sp
-
- push si
-
- push di
-
-
-
- mov ax, [bp+argbase+2]
-
- mov bx, [bp+argbase+4]
-
- mov cx, [bp+argbase]
-
- call plot
-
-
-
- pop di
-
- pop si
-
- mov sp, bp
-
- pop bp
-
- ret
-
-
-
- pEnd CGA_point
-
-
-
- ;
-
- ; write for pixels for circle drawing
-
- ;
-
- ; void CGA_write_pix(x1, y1, x2, y2, c)
-
- ;
-
-
-
- pBegin CGA_write_pix
-
-
-
- push bp
-
- mov bp, sp
-
- push si
-
- push di
-
-
-
- mov bx, [bp+argbase+8] ; bx = c (for plot)
-
- mov cx, [bp+argbase] ; cx = x1
-
- cmp cx, g_xcliplo ; check for clipping
-
- jb w2
-
- cmp cx, g_xcliphi
-
- ja w2
-
-
-
- mov ax, [bp+argbase+2] ; ax = y1
-
- cmp ax, g_ycliplo ; do clipping
-
- jb w1
-
- cmp ax, g_ycliphi
-
- ja w1
-
-
-
- push bx ; plot (x1, y1)
-
- push cx
-
- call plot
-
- pop cx
-
- pop bx
-
-
-
- w1: mov ax, [bp+argbase+6] ; ax = y2
-
- cmp ax, g_ycliplo
-
- jb w2
-
- cmp ax, g_ycliphi
-
- ja w2
-
-
-
- push bx ; plot (x1, y2)
-
- call plot
-
- pop bx
-
-
-
- w2: mov cx, [bp+argbase+4] ; cx = x2
-
- cmp cx, g_xcliplo
-
- jb w4
-
- cmp cx, g_xcliphi
-
- ja w4
-
-
-
- mov ax, [bp+argbase+2] ; ax = y1
-
- cmp ax, g_ycliplo ; do clipping
-
- jb w3
-
- cmp ax, g_ycliphi
-
- ja w3
-
-
-
- push bx ; plot (x2, y1)
-
- push cx
-
- call plot
-
- pop cx
-
- pop bx
-
-
-
- w3: mov ax, [bp+argbase+6] ; ax = y2
-
- cmp ax, g_ycliplo
-
- jb w4
-
- cmp ax, g_ycliphi
-
- ja w4
-
-
-
- call plot ; plot (x2, y2)
-
-
-
- w4: pop di
-
- pop si
-
- mov sp, bp
-
- pop bp
-
- ret
-
-
-
- pEnd CGA_write_pix
-
-
-
- df_ CGA_point
-
- df_ CGA_write_pix
-
-
-
- endcs _cgagrafa
-
-
-
- end
-
-